package org.stone.project.cacheRedis.service.impl;

import cn.hutool.core.util.ObjectUtil;
import org.springframework.data.redis.core.RedisTemplate;
import org.stone.project.common.pojo.dto.SysDictDataMeta;
import org.stone.project.cacheInterface.service.DictCacheService;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 字典工具类
 */
public class DictOptServiceImpl implements DictCacheService {
    public DictOptServiceImpl(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    private RedisTemplate<String,Object> redisTemplate;

    /**
     * 设置字典缓存
     *
     * @param key 参数键
     * @param dictDatas 字典数据列表
     */
    @Override
    public void setDictCache(String key, List<SysDictDataMeta> dictDatas)
    {
        Map<String, SysDictDataMeta> map = dictDatas.stream()
                .collect(Collectors.toMap(ele -> ele.getDictValue(), ele -> ele));
        redisTemplate.opsForHash().putAll(key,map);
    }

    /**
     * 获取字典缓存
     *
     * @param key 参数键
     * @return dictDatas 字典数据列表
     */
    @Override
    public List<SysDictDataMeta> getDictCache(String key)
    {
        List<Object> values = redisTemplate.opsForHash().values(key);
        if (ObjectUtil.isNull(values))
            return Collections.emptyList();
        else {
            return values.stream().map(ele->(SysDictDataMeta)ele).collect(Collectors.toList());
        }
    }

    /**
     * 通过值获取列表
     * @param dictTypeKey
     * @param dictValue
     * @return
     */
    @Override
    public SysDictDataMeta getCacheByDictTypeAndDictValue(String dictTypeKey,String dictValue){
        return (SysDictDataMeta)(redisTemplate.opsForHash().get(dictTypeKey, dictValue));
    }


    /**
     * 通过类别label获取
     * @param dictTypeKey
     * @param label
     * @return
     */
    @Override
    public SysDictDataMeta getCacheByDictTypeAndDictLabel(String dictTypeKey,String label){
        List<Object> values = redisTemplate.opsForHash().values(dictTypeKey);
        if (ObjectUtil.isNull(values))
            return null;
        else {
            return (SysDictDataMeta)(values.stream().filter(ele->((SysDictDataMeta)ele).getDictLabel().equals(label)).findFirst().orElse(null));
        }
    }

    /**
     * 删除指定字典缓存
     *
     * @param key 字典键
     */
    @Override
    public void deleteObject(String key){
        redisTemplate.delete(key);
    }

    /**
     * todo 修改
     * 设置cache key
     * @param keyPrefix
     */
    @Override
    public void clearDictCache(String keyPrefix){
        Set<String> keys = redisTemplate.keys(keyPrefix);
        redisTemplate.delete(keys);
    }
}
